package com.showsu.editor.utils.remote;

import com.alibaba.fastjson.JSON;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.showsu.editor.entity.ai.AIXhsNoteKeywords;
import com.showsu.editor.entity.bigmodel.ChatCompletionsRequest;
import com.showsu.editor.entity.bigmodel.ChatCompletionsResponse;
import com.showsu.editor.utils.HttpClientUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author: William
 * @Description:
 * @Date: Created in 6:52 下午 2024/10/10
 * @Modified By:
 */
@Slf4j
@Component
public class BigmodelUtil {

    private static final int timeout = 120000;

    private static Type type = new TypeToken<ChatCompletionsResponse>(){}.getType();
    private static Gson gson = new Gson();

    @Value("${bigmodel.url}")
    private String baseUrl;

    @Value("${bigmodel.token}")
    private String token;


    /**
     * 通过一个固定的模式分析xhs笔记内容，获得笔记标签
     * @param content
     * @return
     */
    public String getXhsNoteTagByAnalyzeContent(String content) {
        try {
            ChatCompletionsRequest request = new ChatCompletionsRequest();
            request.setModel("glm-4-plus");
            request.setTop_p(0.7d);
            request.setTemperature(0.95d);
            request.setMax_tokens(1024);

            List<ChatCompletionsRequest.ToolsDTO> toolList = new ArrayList<>();
            request.setTools(toolList);
            ChatCompletionsRequest.ToolsDTO tool = request.new ToolsDTO();
            toolList.add(tool);
            tool.setType("retrieval");
            ChatCompletionsRequest.ToolsDTO.RetrievalDTO retrieval = tool.new RetrievalDTO();
            tool.setRetrieval(retrieval);
            retrieval.setKnowledge_id("1853760383203041280");

            List<ChatCompletionsRequest.MessagesDTO> messagesList = new ArrayList<>();
            request.setMessages(messagesList);
            ChatCompletionsRequest.MessagesDTO messages0 = request.new MessagesDTO();
            messagesList.add(messages0);
            messages0.setContent("你是一个乐于解答各种问题的助手，你的任务是为用户提供专业、准确、有见地的建议。");
            messages0.setRole("system");
            ChatCompletionsRequest.MessagesDTO messages1 = request.new MessagesDTO();
            messagesList.add(messages1);
            messages1.setRole("user");

            StringBuilder sb = new StringBuilder("分析以下内容的内容分类，并匹配最合适的一个标准内容分类直接输出，无需分析过程：");
            messages1.setContent(sb.append(content).append(" 标准内容分类见knowledge_id：1853760383203041280").toString());

            Map<String, String> headers = new HashMap<>();
            headers.put("Authorization", "Bearer " + token);

            long start = System.currentTimeMillis();
            String response = HttpClientUtil.postByJson(baseUrl + "/api/paas/v4/chat/completions", headers, JSON.toJSONString(request), timeout);
            log.info("请求智谱AI语言模型获取xhs笔记标签-耗时:{}-content:{}", System.currentTimeMillis() - start, messages1.getContent());
            if (StringUtils.isBlank(response)) {
                log.info("请求智谱AI语言模型获取xhs笔记标签，响应结果为空，content:{}", messages1.getContent());
                return null;
            }
            ChatCompletionsResponse chatCompletionsResponse = gson.fromJson(response, type);
            if (chatCompletionsResponse != null && chatCompletionsResponse.getUsage() != null) {
                log.info("请求智谱AI语言模型获取xhs笔记标签，token消耗，usage:{}", JSON.toJSONString(chatCompletionsResponse.getUsage()));
            }
            if (chatCompletionsResponse == null
                    || CollectionUtils.isEmpty(chatCompletionsResponse.getChoices())
                    || chatCompletionsResponse.getChoices().get(0) == null
                    || chatCompletionsResponse.getChoices().get(0).getMessage() == null
                    || StringUtils.isBlank(chatCompletionsResponse.getChoices().get(0).getMessage().getContent())) {
                log.info("请求智谱AI语言模型获取xhs笔记标签，响应结果中没有message, content:{}, response:{}", messages1.getContent(), response);
                return null;
            }
            String[] messages = chatCompletionsResponse.getChoices().get(0).getMessage().getContent().split("\n");
            return messages[0].replace("标准内容分类: ", "");
        } catch (Exception e) {
            log.error("BigmodelUtil.getXhsNoteTagByAnalyzeContent error", e);
            return null;
        }
    }

    /**
     * 通过一个固定的模式分析xhs笔记内容，获得笔记关键词
     * @param content
     * @return
     */
    public List<AIXhsNoteKeywords> getXhsNoteKeywordsByAnalyzeContent(String content) {
        List<AIXhsNoteKeywords> result = new ArrayList<>();
        try {
            ChatCompletionsRequest request = new ChatCompletionsRequest();
            //用8k个笔记内容-关键词的案例微调出来的模型
            request.setModel("glm-4-flash:1557184542:xak:lxeueakk");
            request.setTop_p(0.7d);
            request.setTemperature(0.95d);
            request.setMax_tokens(1024);

            List<ChatCompletionsRequest.MessagesDTO> messagesList = new ArrayList<>();
            request.setMessages(messagesList);
            ChatCompletionsRequest.MessagesDTO messages0 = request.new MessagesDTO();
            messagesList.add(messages0);
            messages0.setContent("你是一个乐于解答各种问题的助手，你的任务是为用户提供专业、准确、有见地的建议。");
            messages0.setRole("system");
            ChatCompletionsRequest.MessagesDTO messages1 = request.new MessagesDTO();
            messagesList.add(messages1);
            messages1.setRole("user");

            StringBuilder sb = new StringBuilder("请分析以下小红书笔记，并给出3～5个笔记关键词，按照关键词搜索量从高到低排序，无需分析过程：");
            messages1.setContent(sb.append(content).toString());

            Map<String, String> headers = new HashMap<>();
            headers.put("Authorization", "Bearer " + token);

            long start = System.currentTimeMillis();
            String response = HttpClientUtil.postByJson(baseUrl + "/api/paas/v4/chat/completions", headers, JSON.toJSONString(request), timeout);
            log.info("BigmodelUtil.getXhsNoteKeywordsByAnalyzeContent-耗时:{}-content:{}", System.currentTimeMillis() - start, messages1.getContent());
            if (StringUtils.isBlank(response)) {
                log.info("请求智谱AI语言模型获取xhs笔记关键词，响应结果为空，content:{}", messages1.getContent());
                return result;
            }
            ChatCompletionsResponse chatCompletionsResponse = gson.fromJson(response, type);
            if (chatCompletionsResponse != null && chatCompletionsResponse.getUsage() != null) {
                log.info("请求智谱AI语言模型获取xhs笔记关键词，token消耗，usage:{}", JSON.toJSONString(chatCompletionsResponse.getUsage()));
            }
            if (chatCompletionsResponse == null
                    || CollectionUtils.isEmpty(chatCompletionsResponse.getChoices())
                    || chatCompletionsResponse.getChoices().get(0) == null
                    || chatCompletionsResponse.getChoices().get(0).getMessage() == null
                    || StringUtils.isBlank(chatCompletionsResponse.getChoices().get(0).getMessage().getContent())) {
                log.info("请求智谱AI语言模型获取xhs笔记关键词，响应结果中没有message, content:{}, response:{}", messages1.getContent(), response);
                return result;
            }
            //content中的内容通常是以下格式，所以要做一点简单的解析
            //1. 考研
            //2. 研究生
            //3. 学历
            //4. 提升学历
            //5. 26考研
            String[] messages = chatCompletionsResponse.getChoices().get(0).getMessage().getContent().split("\n");
            for (int i = 0; i < messages.length; i ++) {
                AIXhsNoteKeywords aiXhsNoteKeywords=new AIXhsNoteKeywords();
                aiXhsNoteKeywords.setKeyword(messages[i].substring(messages[i].indexOf(".") + 1));
                result.add(aiXhsNoteKeywords);
            }
        } catch (Exception e) {
            log.error("BigmodelUtil.getXhsNoteKeywordsByAnalyzeContent error", e);
        }
        return result;
    }

    public ChatCompletionsResponse getCheckTextByAnalyzeContent(String content) {
        return this.getCheckTextByAnalyzeContent("glm-4-plus",content);
    }


    /**
     * 通过一个固定的模式分析xhs笔记内容，获得可能导致笔记限流和违规的违禁词
     * @param content
     * @return
     */
    public ChatCompletionsResponse getCheckTextByAnalyzeContent(String model,String content) {
        if(StringUtils.isBlank(model)){
            model="glm-4-plus";
        }
        try {
            ChatCompletionsRequest request = new ChatCompletionsRequest();
            request.setModel(model);
            request.setTop_p(0.7d);
            request.setTemperature(0.95d);
            request.setMax_tokens(3096);
            List<ChatCompletionsRequest.ToolsDTO> toolsDTOList=new ArrayList<>();
            ChatCompletionsRequest.ToolsDTO toolsDTO=request.new ToolsDTO();
            ChatCompletionsRequest.ToolsDTO.webSearchDTO webSearchDTO=toolsDTO.new webSearchDTO();
            webSearchDTO.setEnable(true);
            toolsDTO.setType("web_search");
            toolsDTO.setWeb_search(webSearchDTO);
            toolsDTOList.add(toolsDTO);
            request.setTools(toolsDTOList);

            List<ChatCompletionsRequest.MessagesDTO> messagesList = new ArrayList<>();
            request.setMessages(messagesList);
            ChatCompletionsRequest.MessagesDTO messages0 = request.new MessagesDTO();
            messagesList.add(messages0);
            messages0.setContent("作为一个小红书资深运营，你擅长从笔记找出全部的可能导致笔记限流和违规的违禁词，你的任务是为用户提供专业、准确、有见地的建议。");
            messages0.setRole("system");
            ChatCompletionsRequest.MessagesDTO messages1 = request.new MessagesDTO();
            messagesList.add(messages1);
            messages1.setRole("user");

            String userContent = "\""+content + "\"\n\n" +
                    "请分析以上小红书笔记，是否存在可能导致笔记限流和违规的违禁词，仅罗列出相关违禁词并说明风险和修改建议，无需示例与总结，并按如下格式输出（注意：#标签不做分析）：\n" +
                    "\n" +
                    "### 可能的违禁词及风险分析\n" +
                    "\n" +
                    "1. **坠近**\n" +
                    "   - **风险分析**：错别字或网络用语，可能影响平台内容质量。\n" +
                    "   - **修改建议**：改为标准用语“最近”。\n" +
                    "\n" +
                    "### 其他注意事项\n" +
                    "\n" +
                    "1. **坠近**\n" +
                    "   - **风险分析**：错别字或网络用语，可能影响平台内容质量。\n" +
                    "   - **修改建议**：改为标准用语“最近”。\n" +
                    "\n" +
                    "通过以上建议，可以进一步降低笔记被限流或违规的风险。";
            messages1.setContent(userContent);


            Map<String, String> headers = new HashMap<>();
            headers.put("Authorization", "Bearer " + token);

            long start = System.currentTimeMillis();
            String response = HttpClientUtil.postByJson(baseUrl + "/api/paas/v4/chat/completions", headers, JSON.toJSONString(request), timeout);
            log.info("BigmodelUtil.getCheckTextByAnalyzeContent-耗时:{}-content:{}", System.currentTimeMillis() - start, messages1.getContent());
            if (StringUtils.isBlank(response)) {
                log.info("请求智谱AI语言模型获取xhs违禁词，响应结果为空，content:{}", messages1.getContent());
                return null;
            }
            ChatCompletionsResponse chatCompletionsResponse = gson.fromJson(response, type);
            if (chatCompletionsResponse != null && chatCompletionsResponse.getUsage() != null) {
                log.info("请求智谱AI语言模型获取xhs违禁词，token消耗，usage:{}", JSON.toJSONString(chatCompletionsResponse.getUsage()));
                log.info("请求智谱AI语言模型获取xhs违禁词，requestId:{}",chatCompletionsResponse.getRequestId());
            }
            if (chatCompletionsResponse == null
                    || CollectionUtils.isEmpty(chatCompletionsResponse.getChoices())
                    || chatCompletionsResponse.getChoices().get(0) == null
                    || chatCompletionsResponse.getChoices().get(0).getMessage() == null
                    || StringUtils.isBlank(chatCompletionsResponse.getChoices().get(0).getMessage().getContent())) {
                log.info("请求智谱AI语言模型获取xhs违禁词，响应结果中没有message, content:{}, response:{}", messages1.getContent(), response);
                return null;
            }
            //content中的内容通常是以下格式，所以要做一点简单的解析
            //1. 考研
            //2. 研究生
            //3. 学历
            //4. 提升学历
            //5. 26考研
//            String[] messages = chatCompletionsResponse.getChoices().get(0).getMessage().getContent().split("\n");
//            for (int i = 0; i < messages.length; i ++) {
//                result.add(messages[i].substring(messages[i].indexOf(".") + 1));
//            }
//            return chatCompletionsResponse.getChoices().get(0).getMessage().getContent();
            return chatCompletionsResponse;
        } catch (Exception e) {
            log.error("BigmodelUtil.getCheckTextByAnalyzeContent error", e);
        }
        return null;
    }

    public static void main(String[] args) {
        String userContent = "作为一个小红书资深运营，你擅长从笔记找出全部的可能导致笔记限流和违规的违禁词，你的任务是为用户提供专业、准确、有见地的建议。"+"\n\n" +
                "请分析以上小红书笔记，是否存在可能导致笔记限流和违规的违禁词，仅罗列出相关违禁词并说明风险和修改建议，无需示例与总结，并按如下格式输出（注意：#标签不做分析）：\n" +
                "\n" +
                "### 可能的违禁词及风险分析\n" +
                "\n" +
                "1. **坠近**\n" +
                "   - **风险分析**：错别字或网络用语，可能影响平台内容质量。\n" +
                "   - **修改建议**：改为标准用语“最近”。\n" +
                "\n" +
                "### 其他注意事项\n" +
                "\n" +
                "1. **坠近**\n" +
                "   - **风险分析**：错别字或网络用语，可能影响平台内容质量。\n" +
                "   - **修改建议**：改为标准用语“最近”。\n" +
                "\n" +
                "通过以上建议，可以进一步降低笔记被限流或违规的风险。";
        System.out.println(userContent.length());
        System.out.println(userContent.length()/1.6);
//        BigmodelUtil bigmodelUtil=new BigmodelUtil();
//        List<String > modelList=new ArrayList<>();
////        modelList.add("glm-4-flashx");
////        modelList.add("glm-4-flash");
////        modelList.add("glm-4-airx");
////        modelList.add("glm-4-air");
//        modelList.add("glm-4-plus");
//        for(String model : modelList){
//            System.out.println("==========================================");
//            System.out.println(model);
//            ChatCompletionsResponse t1=bigmodelUtil.getCheckTextByAnalyzeContent(model,"深度解析杭马组委会运作机制\n" +
//                    "杭马，你为什么烂泥扶不上墙？杭马是老牌赛事，1987年就开始办赛，不存在经验不足的情况。但是杭马真的配得上老牌赛事吗？很多人都直摇头，我们几张图解析杭马为什么烂泥扶不上墙。\n" +
//                    "根据公开采招网站信息显示，杭马所有服务的决策机构，均在浙江省体育局竞赛中心，而不是运营单位。图2、3、4显示，杭马奖牌供应商是警用设备公司，据悉以前只做过警徽，主要业务是生产防爆盾和警棍。杭马官网在23年的供应商是蓦然科技，同时蓦然科技也是浙江省马拉松及路跑协会的供应商，由于众所周知的原因，舆情压力太大，今年花了723000元更换了数字心动报名。\n" +
//                    "杭马运营商究竟是干什么的？在2022-24经过大丰为首的联合体中标之后，省体育局收获了联合体的70000000收入，运营公司给政府单位收入，在路跑赛事中恐怕也是独一家。运营公司收入来源于赞助商广告收入，三年的收入需要填平如此大窟窿，恐怕也有很大压力#2024杭州马拉松 #杭州马拉松 #马拉松比赛 #马拉松 #路跑赛事典型案例 #路跑赛事 #杭州 #浙江省体育局 #中国田径");
//            System.out.println(t1.getChoices().get(0).getMessage().getContent());
//            System.out.println("==========================================");
//        }

//        List<String> t2=bigmodelUtil.getXhsNoteKeywordsByAnalyzeContent("深度解析杭马组委会运作机制\n" +
//                "杭马，你为什么烂泥扶不上墙？杭马是老牌赛事，1987年就开始办赛，不存在经验不足的情况。但是杭马真的配得上老牌赛事吗？很多人都直摇头，我们几张图解析杭马为什么烂泥扶不上墙。\n" +
//                "根据公开采招网站信息显示，杭马所有服务的决策机构，均在浙江省体育局竞赛中心，而不是运营单位。图2、3、4显示，杭马奖牌供应商是警用设备公司，据悉以前只做过警徽，主要业务是生产防爆盾和警棍。杭马官网在23年的供应商是蓦然科技，同时蓦然科技也是浙江省马拉松及路跑协会的供应商，由于众所周知的原因，舆情压力太大，今年花了723000元更换了数字心动报名。\n" +
//                "杭马运营商究竟是干什么的？在2022-24经过大丰为首的联合体中标之后，省体育局收获了联合体的70000000收入，运营公司给政府单位收入，在路跑赛事中恐怕也是独一家。运营公司收入来源于赞助商广告收入，三年的收入需要填平如此大窟窿，恐怕也有很大压力#2024杭州马拉松 #杭州马拉松 #马拉松比赛 #马拉松 #路跑赛事典型案例 #路跑赛事 #杭州 #浙江省体育局 #中国田径");
//        System.out.println(JSON.toJSONString(t2));
    }
}
